package com.zou.practice.sort;

import com.alibaba.fastjson.JSON;

/**
 * https://zhuanlan.zhihu.com/p/172524701
 *
 * @author zouyaowen
 * @date 2020-09-09
 */
public class BubbleSort {


    /**
     * 比较类排序：通过比较来决定元素间的相对次序，由于其时间复杂度不能突破O(nlogn)，因此也称为非线性时间比较类排序
     * 非比较类排序：不通过比较来决定元素间的相对次序，它可以突破基于比较排序的时间下界，以线性时间运行，
     * 需要开辟额外的存储空间，因此也称为线性时间非比较类排序。
     *
     * @param args 参数
     */
    public static void main(String[] args) {
        int[] arr = {1, 3, 2, 9, 8, 7, 11};
        System.out.println(JSON.toJSONString(arr));
        // bubbleSort(arr);
        bubbleSortImprove(arr);
        System.out.println(JSON.toJSONString(arr));
    }

    /**
     * 优化版
     *
     * @param arr 数组
     */
    private static void bubbleSortImprove(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            boolean flag = true;
            for (int j = 0; j < n - i - 1; j++) {
                if (arr[j + 1] < arr[j]) {
                    flag = false;
                    int t = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = t;
                }
                // 一趟下来是否发生位置交换
                if (flag) {
                    break;
                }
            }
        }
    }

    /**
     * 冒泡排序时间复杂度N方
     *
     * @param arr 数据
     */
    private static void bubbleSort(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }


}
